package top.jacktgq.file

import groovy.xml.XmlSlurper

/**
 @Author CandyWall
 @Date 2021/4/28--1:04
 @Description xml文件的解析
 */
def xmlStr = '''\
<response version-api="2.0">
    <value>
        <books id="1" classification="android">
            <book available="20" id="1">
                <title>疯狂Android讲义</title>
                <author id="1">李刚</author>
            </book>
            <book available="14" id="2">
               <title>第一行代码</title>
               <author id="2">郭林</author>
           </book>
           <book available="13" id="3">
               <title>Android开发艺术探索</title>
               <author id="3">任玉刚</author>
           </book>
           <book available="5" id="4">
               <title>Android源码设计模式</title>
               <author id="4">何红辉</author>
           </book>
       </books>
       <books id="2" classification="web">
           <book available="10" id="1">
               <title>Vue从入门到精通</title>
               <author id="4">李刚</author>
           </book>
       </books>
   </value>
</response>
'''
// println xmlStr
// groovy中解析xml
def xmlSlurper = new XmlSlurper()
def xml = xmlSlurper.parseText(xmlStr)
// 疯狂Android讲义
println xml.value.books[0].book[0].title.text()
// 10
println xml.value.books[1].book[0].@available

// 查找所有作者是李刚的书籍信息
def bookList = []
xml.value.books.each {
    books -> books.book.each {
        book ->
            {
                if (book.author.text().equals('李刚')) {
                    bookList.add(book.title.text())
                }
            }

    }
}
println bookList

// 使用深度遍历方式简化遍历操作，从而完成节点查找
println xml.depthFirst().findAll {
    book -> book.author.text() == '李刚'
}.collect {
    it.title.text()
}

// 可以继续简化深度遍历
// 使用深度优先遍历方式简化遍历操作，从而完成节点查找
println xml.'**'.findAll {
    book -> book.author.text() == '李刚'
}.collect {
    it.title.text()
}

// 使用广度优先遍历方式简化遍历操作，从而完成节点查找
println xml.breadthFirst().findAll {
    book -> book.author.text() == '李刚'
}.collect {
    it.title.text()
}

// 可以继续简化广度遍历
// 使用广度优先遍历方式简化遍历操作，从而完成节点查找
println xml.value.books.'*'.findAll {
    book -> book.author.text() == '李刚'
}.collect {
    it.title.text()
}
